//
//  CJDevice.swift
//  CJCore
//
//  Created by 陈警卫 on 2024-06-04.
//

import UIKit

@objcMembers open class CJDevice: NSObject {
    
    /// APP Display Name
    public class var displayName: String? {
        return Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String
    }
    
    /// APP Bundle ID
    public class var bundleID: String? {
        return Bundle.main.object(forInfoDictionaryKey: "CFBundleIdentifier") as? String
    }
    
    /// APP Version
    public class var versionShort: String? {
        return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
    }
    
    /// APP Build ID
    public class var buildID: String? {
        return Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String
    }
    
    /// System Version
    public class var systemVersion: String {
        let sv = UIDevice.current.systemVersion
        return sv
    }
    
    /// System Name
    public class var systemName: String {
        let sv = UIDevice.current.systemName
        return sv
    }
    
    /// Device name
    public class var devName: String {
        let sv = UIDevice.current.name
        return sv
    }
    
    /// Device model
    public class var devModel: String {
        let sv = UIDevice.current.model
        return sv
    }
    
    /// Device localizedModel
    public class var localizedModel: String {
        let sv = UIDevice.current.localizedModel
        return sv
    }
}

public extension CJDevice {
    
    /// 设备硬盘空间
    static var diskSpace: Int64 {
        if let attrs = try? FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory()) {
            if let space = attrs[FileAttributeKey.systemSize] as? NSNumber {
                if space.int64Value > 0 {
                    return space.int64Value
                }
            }
        }
        return 0
    }
    
    /// 设备硬盘剩余空间
    static var diskFreeSpace: Int64 {
        if let attrs = try? FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory()) {
            if let space = attrs[FileAttributeKey.systemFreeSize] as? NSNumber {
                if space.int64Value > 0 {
                    return space.int64Value
                }
            }
        }
        return 0
    }
    
    /// 设备硬盘已使用空间
    static var diskUsedSpace: Int64 {
        let value = diskSpace - diskFreeSpace
        if value > 0 {
            return value
        }
        return 0
    }
    
}

public extension CJDevice {
    
    /// 设备model name
    static var phoneModel: String {
        var phoneInfo = utsname()
        let value = uname(&phoneInfo)
        if value < 0 {
            return "Unknown"
        }
        
        let phoneMirror = Mirror(reflecting: phoneInfo.machine)
        let identifier = phoneMirror.children.reduce("") { partialResult, element in
            guard let value = element.value as? Int8, value != 0 else { return partialResult }
            return partialResult + String(UnicodeScalar(UInt8(value)))
        }
        
        let model = phoneGeneration[identifier] ?? "Unknown"
        return model
    }
    
    /// 设备identifier对应name
    /// https://www.theiphonewiki.com/wiki/Models
    static var phoneGeneration: Dictionary<String, String> {
        return [
            // iPhone
            "iPhone1,1"  : "iPhone",
            "iPhone1,2"  : "iPhone 3G",
            "iPhone2,1"  : "iPhone 3GS",
            "iPhone3,1"  : "iPhone 4",
            "iPhone3,2"  : "iPhone 4",
            "iPhone3,3"  : "iPhone 4",
            "iPhone4,1"  : "iPhone 4S",
            "iPhone5,1"  : "iPhone 5",
            "iPhone5,2"  : "iPhone 5",
            "iPhone5,3"  : "iPhone 5c",
            "iPhone5,4"  : "iPhone 5c",
            "iPhone6,1"  : "iPhone 5s",
            "iPhone6,2"  : "iPhone 5s",
            "iPhone7,2"  : "iPhone 6",
            "iPhone7,1"  : "iPhone 6 Plus",
            "iPhone8,1"  : "iPhone 6s",
            "iPhone8,2"  : "iPhone 6s Plus",
            "iPhone8,4"  : "iPhone SE (1st generation)",
            "iPhone9,1"  : "iPhone 7",
            "iPhone9,3"  : "iPhone 7",
            "iPhone9,2"  : "iPhone 7 Plus",
            "iPhone9,4"  : "iPhone 7 Plus",
            "iPhone10,1" : "iPhone 8",
            "iPhone10,4" : "iPhone 8",
            "iPhone10,2" : "iPhone 8 Plus",
            "iPhone10,5" : "iPhone 8 Plus",
            "iPhone10,3" : "iPhone X",
            "iPhone10,6" : "iPhone X",
            "iPhone11,8" : "iPhone XR",
            "iPhone11,2" : "iPhone XS",
            "iPhone11,6" : "iPhone XS Max",
            "iPhone11,4" : "iPhone XS Max",
            "iPhone12,1" : "iPhone 11",
            "iPhone12,3" : "iPhone 11 Pro",
            "iPhone12,5" : "iPhone 11 Pro Max",
            "iPhone12,8" : "iPhone SE (2nd generation)",
            "iPhone13,1" : "iPhone 12 mini",
            "iPhone13,2" : "iPhone 12",
            "iPhone13,3" : "iPhone 12 Pro",
            "iPhone13,4" : "iPhone 12 Pro Max",
            "iPhone14,4" : "iPhone 13 mini",
            "iPhone14,5" : "iPhone 13",
            "iPhone14,2" : "iPhone 13 Pro",
            "iPhone14,3" : "iPhone 13 Pro Max",
            "iPhone14,6" : "iPhone SE (3rd generation)",
            "iPhone14,7" : "iPhone 14",
            "iPhone14,8" : "iPhone 14 Plus",
            "iPhone15,2" : "iPhone 14 Pro",
            "iPhone15,3" : "iPhone 14 Pro Max",
            
            // iPad
            "iPad1,1"   : "iPad",
            "iPad2,1"   : "iPad 2",
            "iPad2,2"   : "iPad 2",
            "iPad2,3"   : "iPad 2",
            "iPad2,4"   : "iPad 2",
            "iPad3,1"   : "iPad (3rd generation)",
            "iPad3,2"   : "iPad (3rd generation)",
            "iPad3,3"   : "iPad (3rd generation)",
            "iPad3,4"   : "iPad (4th generation)",
            "iPad3,5"   : "iPad (4th generation)",
            "iPad3,6"   : "iPad (4th generation)",
            "iPad6,11"  : "iPad (5th generation)",
            "iPad6,12"  : "iPad (5th generation)",
            "iPad7,5"   : "iPad (6th generation)",
            "iPad7,6"   : "iPad (6th generation)",
            "iPad7,11"  : "iPad (7th generation)",
            "iPad7,12"  : "iPad (7th generation)",
            "iPad11,6"  : "iPad (8th generation)",
            "iPad11,7"  : "iPad (8th generation)",
            "iPad12,1"  : "iPad (9th generation)",
            "iPad12,2"  : "iPad (9th generation)",
            "iPad4,1"   : "iPad Air",
            "iPad4,2"   : "iPad Air",
            "iPad4,3"   : "iPad Air",
            "iPad5,3"   : "iPad Air 2",
            "iPad5,4"   : "iPad Air 2",
            "iPad11,3"  : "iPad Air (3rd generation)",
            "iPad11,4"  : "iPad Air (3rd generation)",
            "iPad13,1"  : "iPad Air (4th generation)",
            "iPad13,2"  : "iPad Air (4th generation)",
            "iPad13,16" : "iPad Air (5th generation)",
            "iPad13,17" : "iPad Air (5th generation)",
            "iPad6,7"   : "iPad Pro (12.9-inch)",
            "iPad6,8"   : "iPad Pro (12.9-inch)",
            "iPad6,3"   : "iPad Pro (9.7-inch)",
            "iPad6,4"   : "iPad Pro (9.7-inch)",
            "iPad7,1"   : "iPad Pro (12.9-inch) (2nd generation)",
            "iPad7,2"   : "iPad Pro (12.9-inch) (2nd generation)",
            "iPad7,3"   : "iPad Pro (10.5-inch)",
            "iPad7,4"   : "iPad Pro (10.5-inch)",
            "iPad8,1"   : "iPad Pro (11-inch)",
            "iPad8,2"   : "iPad Pro (11-inch)",
            "iPad8,3"   : "iPad Pro (11-inch)",
            "iPad8,4"   : "iPad Pro (11-inch)",
            "iPad8,5"   : "iPad Pro (12.9-inch) (3rd generation)",
            "iPad8,6"   : "iPad Pro (12.9-inch) (3rd generation)",
            "iPad8,7"   : "iPad Pro (12.9-inch) (3rd generation)",
            "iPad8,8"   : "iPad Pro (12.9-inch) (3rd generation)",
            "iPad8,9"   : "iPad Pro (11-inch) (2nd generation)",
            "iPad8,10"  : "iPad Pro (11-inch) (2nd generation)",
            "iPad8,11"  : "iPad Pro (12.9-inch) (4th generation)",
            "iPad8,12"  : "iPad Pro (12.9-inch) (4th generation)",
            "iPad13,4"  : "iPad Pro (11-inch) (3rd generation)",
            "iPad13,5"  : "iPad Pro (11-inch) (3rd generation)",
            "iPad13,6"  : "iPad Pro (11-inch) (3rd generation)",
            "iPad13,7"  : "iPad Pro (11-inch) (3rd generation)",
            "iPad13,8"  : "iPad Pro (12.9-inch) (5th generation)",
            "iPad13,9"  : "iPad Pro (12.9-inch) (5th generation)",
            "iPad13,10" : "iPad Pro (12.9-inch) (5th generation)",
            "iPad13,11" : "iPad Pro (12.9-inch) (5th generation)",
            "iPad2,5"   : "iPad mini",
            "iPad2,6"   : "iPad mini",
            "iPad2,7"   : "iPad mini",
            "iPad4,4"   : "iPad mini 2",
            "iPad4,5"   : "iPad mini 2",
            "iPad4,6"   : "iPad mini 2",
            "iPad4,7"   : "iPad mini 3",
            "iPad4,8"   : "iPad mini 3",
            "iPad4,9"   : "iPad mini 3",
            "iPad5,1"   : "iPad mini 4",
            "iPad5,2"   : "iPad mini 4",
            "iPad11,1"  : "iPad mini (5th generation)",
            "iPad11,2"  : "iPad mini (5th generation)",
            "iPad14,1"  : "iPad mini (6th generation)",
            "iPad14,2"  : "iPad mini (6th generation)",
            // iTouch
            "iPod1,1" : "iTouch 1",
            "iPod2,1" : "iTouch 2",
            "iPod3,1" : "iTouch 3",
            "iPod4,1" : "iTouch 4",
            "iPod5,1" : "iTouch 5",
            "iPod7,1" : "iTouch 6",
            "iPod9,1" : "iTouch 7",
            // 其他
            "i386"   : "iPhone Simulator",
            "x86_64" : "iPhone Simulator",
        ]
    }
    
}
